/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import hibernate.Busqueda;
import hibernate.GestorHibernate;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author raul
 */
public abstract class GestorModelo<T> extends GestorHibernate implements IGestorModelo<T> {
    
    T modelo;
    T oldModelo;

    public T getModelo() {
        return modelo;
    }

    @Override
    public void setModelo(T modelo) {
        try {
            oldModelo = clonar(modelo);
        } catch (CloneNotSupportedException ex) {
            System.out.println("No se pudo clonar el objeto. Chequear que implemente Cloneable");
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
        }
        this.modelo = modelo;
    }

    public T getOldModelo() {
        return oldModelo;
    }

    @Override
    public void guardar() {
        super.guardarObjeto(getModelo());
    }

    @Override
    public void actualizar() {
        super.actualizarObjeto(getModelo());
    }

    protected List quitarRepeticionesDeLista(List lista) {
        return new ArrayList(new TreeSet(lista));
    }
    
    /** Devuelve la lista de objetos de la <code>clase</code> indicada que se
     * encuentran ACTIVOS (no eliminados).
     * 
     * @param clase la clase cuyos objetos se listaran
     * @return 
     */
    protected List listarClase(Class clase){
        Busqueda busq = new Busqueda(clase);
        busq.addEq("estado", ACTIVO);
        return busq.ejecutar();
    }

    @Override
    public boolean validaModelo() {
        return modelo.equals(oldModelo) || noExiste();
    }

    @Override
    public void deshacerCambios() {
        super.refescarObjeto(getModelo());
    }
    
    public abstract List buscar(CriterioBusqueda [] criterios);
    
    protected abstract T clonar(T modelo) throws CloneNotSupportedException;


    protected void addRestricciones(Busqueda busqueda, CriterioBusqueda[] criterios, HashMap<String, String> mapFiltros) {
        for (CriterioBusqueda c : criterios) {
            if (c.getValor() instanceof String) {
                busqueda.addIlike(mapFiltros.get(c.getFiltro()), (String) c.getValor());
            } else if (c.getValor() instanceof Collection) {
                List list = new ArrayList();
                Iterator i = ((Collection) c.getValor()).iterator();
                while (i.hasNext()) {
                    list.add(i.next().toString());
                }
                busqueda.addIn(mapFiltros.get(c.getFiltro()), list);
            } else {
                busqueda.addEq(mapFiltros.get(c.getFiltro()), c.getValor());
            }
        }
    }
    
}
